package com.openlogic.flow.service;

import java.util.List;
import java.util.Map;

import org.dromara.warm.flow.orm.entity.FlowInstance;

import com.mybatisflex.core.service.IService;
import com.openlogic.common.core.web.domain.PageData;
import com.openlogic.flow.domain.dto.FlowCancelDto;
import com.openlogic.flow.domain.dto.FlowInvalidDto;
import com.openlogic.flow.domain.query.FlowInstanceQuery;
import com.openlogic.flow.domain.vo.FlowInstanceVo;

/**
* @ClassName: FlowInstanceService
* @Description: 流程实例 服务接口层
* @author weiyongpeng
* @date 2025年2月12日 下午9:20:38
 */
public interface IFlowInstanceService extends IService<FlowInstance>{

	/**
	* 描述：分页查询正在运行的流程实例
	* @Title: selectRunningInstanceList
	* @param instanceQuery
	* @return
	* @author weiyongpeng
	* @date  2025年2月12日 下午9:20:28
	 */
    PageData<FlowInstanceVo> selectRunningInstanceList(FlowInstanceQuery instanceQuery);

    /**
    * 描述：分页查询已结束的流程实例
    * @Title: selectFinishInstanceList
    * @param instanceQuery
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:20:18
     */
    PageData<FlowInstanceVo> selectFinishInstanceList(FlowInstanceQuery instanceQuery);

    /**
    * 描述：根据业务id查询流程实例详细信息
    * @Title: queryByBusinessId
    * @param businessId
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:20:08
     */
    FlowInstanceVo queryByBusinessId(Long businessId);

    /**
    * 描述：按照业务id查询流程实例
    * @Title: selectInstByBusinessId
    * @param businessId
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:19:56
     */
    FlowInstance selectInstByBusinessId(String businessId);

    /**
    * 描述：按照实例id查询流程实例
    * @Title: selectInstById
    * @param instanceId
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:19:47
     */
    FlowInstance selectInstById(Long instanceId);

    /**
    * 描述：按照实例id查询流程实例 
    * @Title: selectInstListByIdList
    * @param instanceIds
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:19:39
     */
    List<FlowInstance> selectInstListByIdList(List<Long> instanceIds);

    /**
    * 描述：按照业务id删除流程实例
    * @Title: deleteByBusinessIds
    * @param businessIds
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:19:30
     */
    boolean deleteByBusinessIds(List<Long> businessIds);

    /**
    * 描述：按照实例id删除流程实例
    * @Title: deleteByInstanceIds
    * @param instanceIds
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:19:17
     */
    boolean deleteByInstanceIds(List<Long> instanceIds);

    /**
    * 描述：撤销流程
    * @Title: cancelProcessApply
    * @param flowCancelDto
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:18:48
     */
    boolean cancelProcessApply(FlowCancelDto flowCancelDto);

    /**
    * 描述：获取当前登陆人发起的流程实例
    * @Title: selectCurrentInstanceList
    * @param instanceQuery
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:18:35
     */
    PageData<FlowInstanceVo> selectCurrentInstanceList(FlowInstanceQuery instanceQuery);

    /**
    * 描述：获取流程图,流程记录
    * @Title: chartFlowInstance
    * @param businessId 业务id
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:17:56
     */
    Map<String, Object> chartFlowInstance(String businessId);

    /**
    * 描述：按照实例id更新状态
    * @Title: updateStatus
    * @param instanceId 流程实例id
    * @param status
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:17:29
     */
    void updateStatus(Long instanceId, String status);

    /**
    * 描述：获取流程变量
    * @Title: instanceVariable 
    * @param instanceId 流程实例id
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:17:10
     */
    Map<String, Object> instanceVariable(Long instanceId);

    /**
    * 描述：设置流程变量
    * @Title: setVariable
    * @param instanceId 流程实例id
    * @param variable 流程变量
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:16:45
     */
    void setVariable(Long instanceId, Map<String, Object> variable);

    /**
    * 描述：按任务id查询实例
    * @Title: selectByTaskId
    * @param taskId 流程任务id
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:16:27
     */
    FlowInstance selectByTaskId(Long taskId);

    /**
    * 描述：按任务id查询实例
    * @Title: selectByTaskIdList
    * @param taskIdList 任务id集合
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:15:43
     */
    List<FlowInstance> selectByTaskIdList(List<Long> taskIdList);

    /**
    * 描述：作废流程
    * @Title: processInvalid 
    * @param flowInvalidDto 
    * @return
    * @author weiyongpeng
    * @date  2025年2月12日 下午9:15:34
     */
    boolean processInvalid(FlowInvalidDto flowInvalidDto);
}
